package com.hr.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import java.security.Key;
import java.util.Date;
import java.util.Map;

/**
 * @author LuoQiu
 */
public class JwtUtil {

    /**
     * 生成jwt
     * 使用HS256算法, 私匙使用固定密钥
     *
     * @param secretKey jwt密钥
     * @param ttlMillis jwt过期时间(毫秒)
     * @param claims    设置的信息
     * @return string
     */
    public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
        // 指定签名的时候使用的签名算法
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        // 生成JWT的时间
        long expMillis = System.currentTimeMillis() + ttlMillis;
        Date exp = new Date(expMillis);

        // 使用固定密钥生成一个安全的密钥
        Key key = Keys.secretKeyFor(signatureAlgorithm);

        // 设置jwt的body
        JwtBuilder builder = Jwts.builder()
                .setClaims(claims)
                .signWith(key)
                .setExpiration(exp);

        return builder.compact();
    }

    /**
     * Token解密
     *
     * @param secretKey jwt密钥 此密钥一定要保留好在服务端, 不能暴露出去, 否则签名就可以被伪造
     * @param token     加密后的token
     * @return claims
     */
    public static Claims parseJWT(String secretKey, String token) {
        // 使用固定密钥生成一个安全的密钥
        Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

        // 得到DefaultJwtParser
        Claims claims = Jwts.parserBuilder()
                .setSigningKey(key)
                .build()
                .parseClaimsJws(token)
                .getBody();
        return claims;
    }
}